parser grammar CParser;

options {
  language = Java;
  tokenVocab = CLexer;
}

@header {
  package ejercicio3;
  //import java.util.HashMap;
}

@members {
      //Lista que guarda los errores que se van produciendo durante el analisis lexico
    List<RecognitionException> errors = new ArrayList<RecognitionException>();

    //Metodo que devuelve la lista de errores que se han producido
    public List<RecognitionException> getAllErrors() {
        return errors;
    }
    
    //Metodo que comprueba si se han producido errores
    public boolean hasErrors() {
        return !errors.isEmpty();
    }

    //Metodo del analizador lexico sobrescrito para que los errores que se van
    //produciendo durante el analisis lexico en vez de mostrarse por consola
    //se guarden en la lista de errores (errors)
    @Override
    public void reportError(RecognitionException e) {
        errors.add(e);
    }
    //HashMap memory = new HashMap();
   
}

instrucciones returns [boolean value] : (instruccion[false]) EOF 
                                           {$value = $instruccion.value;};

instruccion [boolean hayWhile] returns [boolean value]: bucle_while[hayWhile] 
                                                        {$value = $bucle_while.value;}
                                                        | 
                                                        sentencia_if[hayWhile] 
                                                        {$value = $sentencia_if.value;}
                                                        ;

bucle_while[boolean hayWhile] returns [boolean value] : WHILE PARENTESIS LETRA PARENTESIS LLAVES cuerpo[hayWhile=true] LLAVES
                                                        {$value = true;};

sentencia_if[boolean hayWhile] returns [boolean value] : IF PARENTESIS LETRA PARENTESIS LLAVES cuerpo[hayWhile] LLAVES
                                                        {$value = $cuerpo.value;};

cuerpo [boolean hayWhile] returns[boolean value] : sentencia_if[hayWhile] 
                         | BREAK SEPARADOR 
                            { if(hayWhile)
                             {
                             System.out.println("Hay bucle while antes del break");
                             $value = true;
                             }
                              else {
                              System.out.println("No hay bucle while antes del break");
                              $value = false;
                              }
                            }
                         ;
